Dockerfile
制作docker镜像分为两种类型:从已有的docker image中导出新的镜像,还有就是通过编写Dockerfile文件制作镜像,一般推荐后者,简单、快速、易维护。
注意事项
- 在制作Dockerfile时,必须要在特有的一个工作目录(一个空目录)中,比如: /opt/docker(以下简称顶级目录);
- 这个目录中有一个Dockerfile文件,文件首字母必须大写;
- 如果我们在制作过程中需要很多打包好的文件,你必须把这些文件放在此目录中,比如:/opt/docker/nginx-libs.tar.gz、/opt/docker/zip/unzip.tar.gz,说白就是以当前目录作为顶级目录;
- 制作镜像中如有不需要的文件或目录,可在顶级目录下创建一个.dockeringore,把不需要的文件写在这里;
常用命令
FROM
指定当前做的镜像是基于哪个已有镜像为基础,也是最重要的一个且是Dockerfile文件中的第一个非注释行,用于为镜像文件构建过程中指定的基础镜像,后续命令运行基于此基准镜像提供的运行环境。
1 | FROM <repository>[:<tag>]或 |
示例
1
FROM busybox:latest
LABLE
之前docker版本使用MAINTANIER(用于让Dockerfile制作者提供更详细的本人信息),现在已被LABLE标签替换,在这里指定Dockerfile的元数据
1 | LABLE <key>=<value> <key>=<value> <key>=<value>... |
示例
1
LABLE maintainer="duanruijun <duanruijun.github.io>"
COPY
用于从Docker主机复制文件至新创建的镜像文件
1 | COPY <src>...<dec> 或 |
示例
1
COPY index.html /data/web/html/
制作一个简单镜像
通过以上三个命令就可以简单的制作一个docker镜像了:
1 | [root@192 docker]# cat /opt/docker/Dockerfile |
由于这里是有了COPY命令,我们需要在/opt/docker目录下新建一个index.html的测试文件,创建一个简单的内容:
1 | [root@192 docker]# cat /opt/docker/index.html |
运行命令docker build完成一个镜像的制作
1 | [root@192 tmp1]# docker build ./ -t tinyhttp:v0.1-1 |
命令参数说明:
- build: 构建命令
- ./: 生成路径,这里是当前路径
- -t: 参数,给生成的镜像打个tag
通过docker image查看镜像
1 | [root@192 docker]# docker image ls |
最后运行一个容器指定这个镜像查看是否有index.html这个文件
1 | [root@192 docker]# docker run --name tinyweb1 --rm tinyhttp:v0.1-1 cat /data/web/html/index.html |
说明文件已经打包到镜像里了
ADD
类似于COPY指令,ADD支持使用TAR文件或URL路径
1 | ADD <src>...<dec> 或 |
示例
1
ADD http://nginx.org/download/nginx-1.15.2.tar.gz /usr/local/src/
WORKDIR
用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录
1 | WORKDIR <dirpath> |
示例
1
2WORKDIR /usr/local/
ADD http://nginx.org/download/nginx-1.15.2.tar.gz ./src/
VOLUME
用于在一个image中创建一个挂载点目录,以挂载Docker host上的卷或其他容器上的卷
1 | VOLUME <mountpoint> 或 |
示例
1
VOLUME /data/mysql/
通过docker build命令构建镜像后查看是否挂载成功:
1 | [root@192 docker]# docker run --name tinyweb1 --rm tinyhttp:v0.1-3 mount |
也可以通过docker inspect命令查看是否挂载:
1 | [root@192 docker]# docker run --name tinyweb1 --rm tinyhttp:v0.1-3 sleep 60 |
EXPOSE
用于为容器打开指定的监听端口以实现与外部通信
1 | EXPOSE <port>[/<protolcol>] [<port>[/<protolcol>]...] |
示例
1
EXPOSE 80/tcp
通过docker build构建后测试
1 | docker run --name tinyweb1 --rm tinyhttp:v0.1-4 /bin/httpd -f -h /data/web/html |
-f: httpd服务运行在前台
-h: 指定httpd的web目录
通过docker inspect tinyweb1获取到容器tinyweb1对外IP地址,就可以访问测试了:
1 | [root@192 docker]# docker inspect tinyweb1 |
此时,只是通过curl命令能够正常访问,但是通过docker port tinyweb1查看暴露的端口为空:
1 | [root@192 docker]# docker port tinyweb1 |
这里需要在运行容器时添加-P(大写)就可以查看了:
1 | [root@192 docker]# docker run --name tinyweb1 --rm -P tinyhttp:v0.1-4 /bin/httpd -f -h /data/web/html |
这样在局域网中访问docker host的5000端口就可以访问容器中的http服务信息了
ENV
用于为镜像定义所需要的环境变量,并可被Dockerfile文件中位于其后的其他指令(如ENV、ADD、COPY等)所调用
调用格式为\$variable_name或\${variable_name}
1 | ENV <key> <value> 或 |
示例
1
2
3
4ENV DOC_ROOT=/data/web/html/ \
WEB_SERVER_PACKAGE="nginx-1.15.2"
COPY index.html ${DOC_ROOT-/data/web/html/} # ${variable_name:-...} 默认值
通过docker build…完成后进行run操作查看传到容器中的变量信息:
1 | [root@192 docker]# docker run --name tinyweb1 --rm tinyhttp:v0.1-5 printenv |
也可以在run的时候通过-e选项给容器中传参达到另一种效果:
1 | [root@192 docker]# docker run --name tinyweb1 --rm -e WEB_SERVER_PACKAGE="nginx-1.15.1" tinyhttp:v0.1-5 printenv |
RUN
用于指定docker build过程中运行的程序,其可以是任何命令
1 | RUN <command> 或 |
示例
1
2RUN cd /usr/local/src && \
tar -x nginx.1.15.2.tar.gz
CMD
类似于RUN指令,CMD也可用于运行任何命令或应用程序,不过,二者运行的时间点不同
RUN指令运行于镜像文件的构建过程中,而CMD运行于基于Dockerfile构建出的新镜像文件启动的一个容器时
CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD指定的命令其可以被docker run命令行选项所覆盖
在Dockerfile中可以存在多个CMD指令,但仅最后一个生效
1 | CMD <command> 或 |
示例
1
CMD /bin/httpd -f -h ...
ENTRYPOINT
类似于CMD指令的功能,用于为容器指定默认的运行程序,从而使得容器像一个单独的可执行程序
与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当成参数传递给ENTRYPOINT指定的程序
不过,docker run命令指定的–entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序
1 | ENTRYPOINT <command> |
示例
1
ENTRYPOINT /bin/httpd -f -h ...
USER
用于指定运行image时的或运行Dockerfile中的任何RUN、CMD或ENTRYPOINT指令指定的程序时的用户名或UID
默认情况下,container运行身份为root
1 | USER <UID>|<UserName> |
示例
1
USER nginx
HEALCHECK
检查CMD command指令健康状态
示例
1
HEALTHCHECK --start-period=3s CMD wget -O - -q http://0.0.0.0/
SHELL
运行程序默认的shell程序,比如:Linux的[“/bin/sh”, “-c”],Windows的[“cmd”, “/s”]
ARG
在docker build中传递参数
1 | ARG auth="sunshine" |
示例
1
docker build --build-arg auth="duanruijun" -t IMAGE_NAME ./
ONBUILD
用于在Dockerfile中定义一个触发器
Dockerfile用于build镜像文件,此镜像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的镜像文件
在后面的这个Dockerfile中的FROM指令在build过程中被执行时,将会“触发”创建其base image的Dockerfile文件中的ONBUILD指令定义的触发器
1 | ONBUILD <INSTRUCTION> |
示例
1
ONBUILD ADD http://nginx.org/download/nginx.1.15.2.tar.gz /usr/local/src/
好的,以上就是Dockerfile中用到的所有常用指令。